Funkcije - prve naloge

Tu je sklop osnovnih nalog za spoznavanje funkcij v Pythonu


Delamo s števili

Sestavite funkciji, ki vrneta zahtevani sredini dveh števil.

1. podnaloga

Zapišite funkcijo aritmeticna(a, b), ki za števili $a$ in $b$ vrne aritmetično sredino teh dveh števil, tj. $\frac{a + b}{2}$.

Uradna rešitev

def aritmeticna (a, b):
    '''Funkcija vrne aritmetično sredino števil a in b.'''
    return (a + b)/2

2. podnaloga

Zapišite funkcijo geometricna(a, b), ki za števili $a$ in $b$ vrne geometrično sredino teh dveh števil, tj. $\sqrt{ab}$.

Namig - oglej si dokumentacijo in zgled

Uradna rešitev

import math # da bomo lahko uporabili vgrajeno funkcijo za korenjenje
def geometricna (a, b):
    '''Funkcija vrne geometrično sredino števil a in b.'''
    return math.sqrt(a*b)

3. podnaloga

Dano imamo decimalno število. Sestavite funkcijo desetinke(x), ki vrne desetinke števila x. Na primer:

>>> desetinke(3.7)
7
>>> desetinke(6.127)
1

Uradna rešitev

def desetinke(x):
     '''vrne desetinke števila x'''
     stevilo = 10 * abs(x) # premik decimalne pike v desno. Da ne bo kaj čudnega, delamo z abs
     celiDel = int(stevilo)
     deset = celiDel % 10 # desetinke so enice novega števila
     return deset

4. podnaloga

Dano imamo decimalno število. Funkcija celiDecimalni(x) naj bi vrnila celi in prvi dve decimalki števila x tako, kot kažejo primeri Na primer:

>>> celiDecimalni(3.7)
(3, 70)
>>> celiDecimalni(-6.127)
(-6, 12)
>>> celiDecimalni(12.0127)
(12, 1)

A funkcija

def celiDecimalni(x):
     '''vrne celi in decimalni del števila x'''
     celiDel = int(x)
     decimalni = 100 * (x - celiDel)
     return celiDel, decimalniDel

ne dela vedno tako. Poišči in odpravi napake!

Uradna rešitev

def celiDecimalni(x):
     '''vrne celi in decimalni del števila x'''
     celiDel = int(x)
     x = abs(x)
     decimalniDel = int((x - abs(celiDel))*100)
     return celiDel, decimalniDel

Posoda z vodo

V posodo, katere dno ima obliko kvadrata, nalijemo vodo vse do roba.

1. podnaloga

Če vanjo vržemo kroglo z radijem 5cm, nam funkcija

import math
def kolikoOstaloirina, višina):
   '''Na tri decimalke natančno vrne, koliko litrov vode je ostalo v posodi'''
   volumenKrogle = 4/ 3 * math.pi * 0.125
   volumenPosode = širina ** 2 * višina / 1000
   ostanekVode = round(volumenPosode - volumenKrogle, 3)
   return ostanekVode

vrne, koliko litrov vode ostane v posodi (vse mere so podane v cm). Spremeni to funkcijo v kolikoOstalo(širina, višina, polmer), ki izračuna koliko litrov vode je ostalo v posodi, če vanjo damo kroglo s polmerom polmer.

Uradna rešitev

import math
def kolikoOstaloirina, višina, polmer):
    '''Na tri decimalke natančno vrne, koliko litrov vode je ostalo v posodi'''
    volumenKrogle = 4/ 3 * math.pi * (polmer / 10)**3
    volumenPosode = širina ** 2 * višina / 1000
    ostanekVode = round(volumenPosode - volumenKrogle, 3)
    return ostanekVode

2. podnaloga

V posodo sedaj položimo stožec, katerega premer je enak širini posode, višina pa enaka globini posode. Napišite funkcijo kolikoOstaloSt(širina, višina, n), ki izračuna koliko litrov vode je ostalo v posodi ter vrne rezultat, zaokrožen na n decimalk. Funkcija sprejme širino in višino posode v cm.

Uradna rešitev

import math
def kolikoOstaloStirina, višina, n):
    '''Na n decimalk natančno vrne, koliko litrov vode je ostalo v posodi'''
    volumenStozca = 1 / 3 * math.pi * irina / 2) ** 2 * višina / 1000
    volumenPosode = širina ** 2 * višina / 1000
    ostanekVode = round(volumenPosode - volumenStozca, n)
    return ostanekVode

Ustvari niz, izpiši niz ....

1. podnaloga

Radi bi sestavili niz, ki ga sestavlja n enakih znakov. Zato sestavi funkcijo kopija, ki vrne niz, ki ga sestavlja n kopij znaka. Če torej napišemo program:

print(kopija('X', 5))
črta = kopija('-', 3)
printrta + " : " + str(lenrta)))

bo izpis:

XXXXX
--- : 3

Uradna rešitev

def kopija(znak, n):
    '''Vrne niz, ki ga sestavlja n kopij znaka n'''
    niz = znak * n 
    return niz

2. podnaloga

Sestavi funkcijo črkaH(n, znak), ki za podatek n izpiše na zaslon veliko črko H, visoko 2n + 1 znakov in široko n + 2 znakov. Primer:

 >>>črkaH(2, 'o')
 o  o
 o  o
 oooo
 o  o
 o  o

Uradna rešitev

def črkaH(n, znak):
    '''Izpišimo črko H'''
    # zgornji del
    vrstica = znak + ' ' * n + znak + '\n'
    print(n * vrstica, end = '') # na koncu smo že skočili v novo vrsto
    # srednji del
    print(znak * (n + 2))
    # spodnji del
    vrstica = znak + ' ' * n + znak + '\n'
    print(n * vrstica, end = '') # na koncu smo že skočili v novo vrsto

Varčevanje na obroke

Pri varčevanju na obroke na začetku vplačamo nek znesek, nato pa vsak mesec doplačujemo mesečne obroke. Zaradi enostavnosti predpostavimo, da so vplačila vedno prvi dan v mesecu, vrednost varčevalnega računa pa se vedno računa ob koncu meseca. Denar, ki ga imamo na varčevalnem računu, se obrestuje po fiksni obrestni meri.

1. podnaloga

V bančništvu pogosto navajamo letno obrestno mero, obrestujemo pa mesečno. Zato je pred računanjem potrebno obrestno mero primerno spremeniti.

Napišite funkcijo mesecna_obrestna_mera(letna_obrestna_mera), ki kot parameter sprejme letno obrestno mero v odstotkih, vrne pa ustrezno mesečno obrestno mero kot decimalno število (torej letni obrestni meri 12% ustreza mesečna obrestna mera 0.01).

Uradna rešitev

def mesecna_obrestna_mera(r):
    '''Letna obrestna mera v obliki mesečne decimalne oblike.'''
    return r / 1200

2. podnaloga

Pri enostavnem obrestovanju s fiksno letno obrestno mero $r$ se vedno obrestuje samo glavnica, ne pa tudi obresti. Tako je vrednost na računu pri začetnem pologu $A_0$ po $n$ mesecih podana s formulo $$A = A_0 * (1 + m * n),$$ kjer je $m$ pripadajoča mesečna obrestna mera.

Sestavite funkcijo enostavno_obrestovanje(polog, letna_obrestna_mera, st_mesecev), ki za enostavno obrestovanju izračuna vrednost denarja na računu pri danem začetnem pologu, letni obrestni meri in številu mesecev.

Primeri:

>>> enostavno_obrestovanje(100, 10, 0)
100.0
>>> enostavno_obrestovanje(100, 12, 1)
101.0
>>> enostavno_obrestovanje(100, 10, 12)
110

Uradna rešitev

def enostavno_obrestovanje(polog, letna_obrestna_mera, st_mesecev):
    '''Vrednost obrestovanega denarja pri enostavnem obrestovanju.'''
    return polog * (1 + mesecna_obrestna_mera(letna_obrestna_mera) * st_mesecev)

3. podnaloga

Pri obrestno obrestnem računu s fiksno letno obrestno mero $r$ se zraven glavnice obrestujejo tudi obresti. Za glavnico $A_0$ je vrednost po $n$ mesecih podana s formulo $$A = A_0(1 + m)^n,$$ kjer je $m$ pripadajoča mesečna obrestna mera.

Sestavite funkcijo obrestno_obrestovanje(polog, letna_obrestna_mera, st_mesecev), ki izračuna vrednost denarja na računu pri danem začetnem pologu, letni obrestni meri in številu mesecev, pri čemer se obresti računajo po obrestno obrestnem računu.

Primeri:

>>> obrestno_obrestovanje(100, 10, 0)
100.0
>>> obrestno_obrestovanje(100, 10, 1)
100.83333333333333
>>> obrestno_obrestovanje(100, 12, 12)
112.68250301319698

Uradna rešitev

def obrestno_obrestovanje(polog, letna_obrestna_mera, st_mesecev):
    '''Vrednost obrestovanega denarja pri obrestno obrestnem obrestovanju.'''
    return polog * (1 + mesecna_obrestna_mera(letna_obrestna_mera)) ** st_mesecev